﻿using System.ComponentModel;
using System.Data;
using System.Net.Sockets;
using System.Windows;
using System.Windows.Controls;
using TeacherLoad.Classes;

namespace TeacherLoad.Windows
{
    /// <summary>
    /// Логика взаимодействия для SpecList.xaml
    /// </summary>
    public partial class SpecList : Window
    {
        private bool _editMode = false;
        private static int _id = 0;
        private static Specialization _spec;
        private static readonly List<Specialization> emptySpecList = new List<Specialization>()
        {
            new Specialization()
        };
        public SpecList()
        {
            InitializeComponent();
            listSpec.DataContext = LoadSpec();
            listSpec.Items.SortDescriptions.Add(new SortDescription("Code", ListSortDirection.Ascending));
            txCode.Focus();
        }
        private List<Specialization> LoadSpec()
        {
            DataTable dt = SendToServer.GetSpec();
            List<Specialization> spec = new List<Specialization>();
            if (dt.Rows.Count != 0)
            {
                foreach (DataRow row in dt.Rows)
                {
                    Specialization sp = new Specialization(
                        Convert.ToInt32(row[0]),
                        row[1].ToString(),
                        row[2].ToString(),
                        row[3].ToString());
                    spec.Add(sp);
                }
                ChangeRow.IsEnabled = true;
            }
            else
            {
                spec = emptySpecList;
                ChangeRow.IsEnabled = false;
            }
            return spec;
        }

        private void btnAddSpec_Click(object sender, RoutedEventArgs e)
        {
            // Проверяем, что обзательные поля заполнены (код, название и квалификация)
            if (txCode.Text == string.Empty || txNameSpec.Text == string.Empty || txQualification.Text == string.Empty)
            {
                MessageBox.Show("Укажите код, название и квалификацию", "Заполните обязательные поля",
                    MessageBoxButton.OK, MessageBoxImage.Warning);
                return;
            }
            Specialization sp = new Specialization(_id, txCode.Text, txNameSpec.Text, txQualification.Text);
            if (_editMode)
            {
                // Изменение записи
                if (SendToServer.EditSpec(sp))
                {
                    ClearTextBox();     // Очищаем поля ввода
                    UpdateUi();         // Обновляем интерфейс
                    _editMode = false;  // Выходим из режима редактирования
                }
                else
                {
                    MessageError();     // Ошибка операции
                    return;
                }
            }
            else
            {
                if (SendToServer.AddSpec(sp))
                {
                    ClearTextBox();     // Очищаем поля ввода
                }
                else
                {
                    MessageError();     // Ошибка операции
                    return;
                }
            }
            listSpec.DataContext = LoadSpec();
        }

        // Сообщение об ошибке записи
        private void MessageError()
        {
            MessageBox.Show("Ошибка записи", "Неудача",
                        MessageBoxButton.OK, MessageBoxImage.Error);
        }

        // Очистка полей ввода (если запись была успешной)
        private void ClearTextBox()
        {
            txCode.Clear();
            txNameSpec.Clear();
            txQualification.Clear();
        }

        // Одновление интерфейса после успешной операции обновления данных
        private void UpdateUi()
        {
            HeaderSpecAdd.Header = "Новая специальность";
            btnAddSpec.Content = "Добавить специальность";
            btnCancelEdit.Visibility = Visibility.Collapsed;
            _editMode = false;
        }

        // Выбор данных из выделенной строки ListBox
        private void listSpec_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (listSpec.SelectedItems.Count > 0)
            {
                _spec = listSpec.SelectedItem as Specialization;
            }
        }

        // Получение данных читателя для изменения и обновления интерфейса
        private void ChangeRow_Click(object sender, RoutedEventArgs e)
        {
            if (listSpec.SelectedItems.Count > 0)
            {
                _editMode = true;   // Установка режима редактирования

                HeaderSpecAdd.Header = "Обновить данные";
                btnAddSpec.Content = "Обновить";
                btnCancelEdit.Visibility = Visibility.Visible;

                txCode.Text = _spec.Code;
                txNameSpec.Text = _spec.NameSpec;
                txQualification.Text = _spec.Qualification;

                // Получаем идентификатор (id) выделенного читателя
                _id = _spec.Id;
            }
        }

        private void btnCancelEdit_Click(object sender, RoutedEventArgs e)
        {
            UpdateUi();
            ClearTextBox();
        }

        private void btnClearText_Click(object sender, RoutedEventArgs e)
        {
            ClearTextBox();
        }

        private void text_TextChanged(object sender, TextChangedEventArgs e)
        {
            bool code = txCode.Text.Length > 0;
            bool name = txNameSpec.Text.Length > 0;
            bool qual = txQualification.Text.Length > 0;
            if ((code || name || qual) && (!_editMode))
            {
                btnClearText.Visibility = Visibility.Visible;
            }
            else
            {
                btnClearText.Visibility = Visibility.Collapsed;
            }
        }
    }
}
